vulkan: Add a repeating sampler
authorMatthias Clasen <mclasen@redhat.com>
Sat, 30 Sep 2017 03:01:34 +0000 (23:01 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 Sep 2017 03:08:14 +0000 (23:08 -0400)
None of the render ops use it, yet.

gsk/gskvulkanrender.c
gsk/gskvulkanrenderpass.c
gsk/gskvulkanrenderprivate.h

index 27ee71ff31f9a9dcdc72d1ce4f2a97e9299ed081..6c0ab98f7c66b0596509266c85e275fa62d7b9c0 100644 (file)
@@ -53,6 +53,7 @@ struct _GskVulkanRender
   GskVulkanImage *target;
 
   VkSampler sampler;
+  VkSampler repeating_sampler;
 
   GList *render_passes;
   GSList *cleanup_images;
@@ -224,6 +225,21 @@ gsk_vulkan_render_new (GskRenderer      *renderer,
                                  NULL,
                                  &self->sampler);
 
+  GSK_VK_CHECK (vkCreateSampler, device,
+                                 &(VkSamplerCreateInfo) {
+                                     .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
+                                     .magFilter = VK_FILTER_LINEAR,
+                                     .minFilter = VK_FILTER_LINEAR,
+                                     .addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT,
+                                     .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
+                                     .unnormalizedCoordinates = VK_FALSE,
+                                     .maxAnisotropy = 1.0,
+                                 },
+                                 NULL,
+                                 &self->repeating_sampler);
+
   self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
 
 #ifdef G_ENABLE_DEBUG
@@ -446,6 +462,7 @@ gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self,
 typedef struct {
   gsize index;
   GskVulkanImage *image;
+  gboolean repeat;
 } HashDescriptorSetIndexEntry;
 
 static guint
@@ -453,7 +470,7 @@ desc_set_index_hash (gconstpointer v)
 {
   const HashDescriptorSetIndexEntry *e = v;
 
-  return GPOINTER_TO_UINT (e->image);
+  return GPOINTER_TO_UINT (e->image) + e->repeat;
 }
 
 static gboolean
@@ -462,12 +479,13 @@ desc_set_index_equal (gconstpointer v1, gconstpointer v2)
   const HashDescriptorSetIndexEntry *e1 = v1;
   const HashDescriptorSetIndexEntry *e2 = v2;
 
-  return e1->image == e2->image;
+  return e1->image == e2->image && e1->repeat == e2->repeat;
 }
 
 gsize
 gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
-                                          GskVulkanImage  *source)
+                                          GskVulkanImage  *source,
+                                          gboolean         repeat)
 {
   HashDescriptorSetIndexEntry lookup;
   HashDescriptorSetIndexEntry *entry;
@@ -475,6 +493,7 @@ gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
   g_assert (source != NULL);
 
   lookup.image = source;
+  lookup.repeat = repeat;
 
   entry = g_hash_table_lookup (self->descriptor_set_indexes, &lookup);
   if (entry)
@@ -482,6 +501,7 @@ gsk_vulkan_render_reserve_descriptor_set (GskVulkanRender *self,
 
   entry = g_new (HashDescriptorSetIndexEntry, 1);
   entry->image = source;
+  entry->repeat = repeat;
   entry->index = g_hash_table_size (self->descriptor_set_indexes);
   g_hash_table_add (self->descriptor_set_indexes, entry);
 
@@ -563,6 +583,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
       HashDescriptorSetIndexEntry *entry = key;
       GskVulkanImage *image = entry->image;
       gsize id = entry->index;
+      gboolean repeat = entry->repeat;
 
       vkUpdateDescriptorSets (device,
                               1,
@@ -575,7 +596,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
                                       .descriptorCount = 1,
                                       .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
                                       .pImageInfo = &(VkDescriptorImageInfo) {
-                                          .sampler = self->sampler,
+                                          .sampler = repeat ? self->repeating_sampler : self->sampler,
                                           .imageView = gsk_vulkan_image_get_image_view (image),
                                           .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
                                       }
@@ -739,6 +760,10 @@ gsk_vulkan_render_free (GskVulkanRender *self)
                     self->sampler,
                     NULL);
 
+  vkDestroySampler (device,
+                    self->repeating_sampler,
+                    NULL);
+
   gsk_vulkan_command_pool_free (self->command_pool);
 
   g_slice_free (GskVulkanRender, self);
index 1c2d05a9b7c3df49d2f7cad3cb1d7b74fd704007..ad767ec74b5b539dbed094adc8a6da34e347a3bd 100644 (file)
@@ -1309,18 +1309,18 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
         case GSK_VULKAN_OP_OPACITY:
         case GSK_VULKAN_OP_BLUR:
         case GSK_VULKAN_OP_COLOR_MATRIX:
-          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
+          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
           break;
 
         case GSK_VULKAN_OP_TEXT:
         case GSK_VULKAN_OP_COLOR_TEXT:
-          op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source);
+          op->text.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->text.source, FALSE);
           break;
 
         case GSK_VULKAN_OP_CROSS_FADE:
         case GSK_VULKAN_OP_BLEND_MODE:
-          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source);
-          op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2);
+          op->render.descriptor_set_index = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source, FALSE);
+          op->render.descriptor_set_index2 = gsk_vulkan_render_reserve_descriptor_set (render, op->render.source2, FALSE);
           break;
 
         default:
index 553699b46ecbdcb22064558df1e754b4bc85c577..09751cb0642804e52c623f61ade24b534559d3c3 100644 (file)
@@ -84,7 +84,8 @@ GskVulkanPipeline *     gsk_vulkan_render_get_pipeline                  (GskVulk
 VkDescriptorSet         gsk_vulkan_render_get_descriptor_set            (GskVulkanRender        *self,
                                                                          gsize                   id);
 gsize                   gsk_vulkan_render_reserve_descriptor_set        (GskVulkanRender        *self,
-                                                                         GskVulkanImage         *source);
+                                                                         GskVulkanImage         *source,
+                                                                         gboolean                repeat);
 void                    gsk_vulkan_render_draw                          (GskVulkanRender        *self);
 
 void                    gsk_vulkan_render_submit                        (GskVulkanRender        *self);